home *** CD-ROM | disk | FTP | other *** search
Wrap
iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) IIIImmmmaaaaggggeeeeVVVViiiissssiiiioooonnnn LLLLiiiibbbbrrrraaaarrrryyyy CCCC++++++++ RRRReeeeffffeeeerrrreeeennnncccceeee MMMMaaaannnnuuuuaaaallll iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) NNNNAAAAMMMMEEEE iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg - Base class for spatial operator images IIIINNNNHHHHEEEERRRRIIIITTTTSSSS FFFFRRRROOOOMMMM ilLink : ilImage : ilCacheImg : ilMemCacheImg : ilOpImg HHHHEEEEAAAADDDDEEEERRRR FFFFIIIILLLLEEEE #include <il/ilSpatialImg.h> CCCCLLLLAAAASSSSSSSS DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNN ilSpatialImg is the base class for spatial operator images. ilSpatialImg has a pure virtual member function and thus cannot be created as an object. It is intended to be used to derive spatial operator images. However, a pointer to an ilSpatialImg can be declared. ilSpatialImg handles the messy details of allocating a working buffer and reading input data based on the size of the kernel being used and the current edge mode. The edge mode specifies how to handle pixels along the edge of a page. For example, additional input data can be used to compute a full page. In this case, the amount of additional input data read depends on the size of the kernel being used. UUUUssssiiiinnnngggg iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg Spatial operators compute a result based on a local neighborhood of pixels. The size of the kernel being used determines the size of the neighborhood. Therefore, the size of the kernel must be known to compute the size of the working buffer. The edge mode determines how pixels along the edge of the image are handled. By default, additional input data is read to allow pixels along the edge to be computed. Several edge modes are supported such as _i_l_P_a_d_S_r_c, _i_l_P_a_d_D_s_t, _i_l_N_o_P_a_d, _i_l_W_r_a_p and _i_l_R_e_f_l_e_c_t. For more details see sssseeeettttEEEEddddggggeeeeMMMMooooddddeeee(). In addition, an offset table, _k_e_r_n_O_f_f, and a value table, _k_e_r_n_V_a_l, are built based on the input kernel specified. The offset table contains offsets into the input buffer to access data corresponding to nonzero kernel elements. The value table contains the nonzero kernel elements and corresponds to the offset table. These tables are provided for convenience to derived classes that choose to use them. DDDDeeeerrrriiiivvvviiiinnnngggg NNNNeeeewwww CCCCllllaaaasssssssseeeessss ffffrrrroooommmm iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg Each derived class must define a constructor to set valid data types and the valid data orders it handles. In addition, the constructor also initializes the additive bias, edge mode and kernel to be used (see sssseeeettttBBBBiiiiaaaassss(), sssseeeettttEEEEddddggggeeeeMMMMooooddddeeee() and sssseeeettttKKKKeeeerrrrnnnneeeellll()). PPPPaaaaggggeeee 1111 iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) IIIImmmmaaaaggggeeeeVVVViiiissssiiiioooonnnn LLLLiiiibbbbrrrraaaarrrryyyy CCCC++++++++ RRRReeeeffffeeeerrrreeeennnncccceeee MMMMaaaannnnuuuuaaaallll iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) Each derived class defines the function ccccaaaallllccccPPPPaaaaggggeeee() to implement its particular image processing algorithm. This function is passed pointers to an input buffer, an output buffer, and parameters describing the start and end of data to be computed in the input buffer. The input buffer is allocated and filled with input data by pppprrrreeeeppppaaaarrrreeeeRRRReeeeqqqquuuueeeesssstttt(). For more details see ccccaaaallllccccPPPPaaaaggggeeee(). In addition, each derived class can define a function called rrrreeeesssseeeettttOOOOpppp() to reset various parameters used in its specific image processing algorithm. If rrrreeeesssseeeettttOOOOpppp() is defined, it hides the rrrreeeesssseeeettttOOOOpppp() inherited from ilOpImg and so it must explicitly call iiiillllOOOOppppIIIImmmmgggg::::::::rrrreeeesssseeeettttOOOOpppp(). This function is automatically called during a reset operation. CCCCLLLLAAAASSSSSSSS MMMMEEEEMMMMBBBBEEEERRRR FFFFUUUUNNNNCCCCTTTTIIIIOOOONNNN SSSSUUUUMMMMMMMMAAAARRRRYYYY CCCCoooonnnnssssttttrrrruuuuccccttttoooorrrr ilSpatialImg() _p_r_o_t_e_c_t_e_d ilSpatialImg(_i_l_I_m_a_g_e* _i_n_p_u_t, _i_l_E_d_g_e_M_o_d_e _e_M_o_d_e = _i_l_P_a_d_S_r_c) _p_r_o_t_e_c_t_e_d SSSSeeeettttttttiiiinnnngggg ssssppppaaaattttiiiiaaaallll ooooppppeeeerrrraaaattttoooorrrr ppppaaaarrrraaaammmmeeeetttteeeerrrrssss void setDynamicKernel(ilKernel* kern) void setEdgeMode(ilEdgeMode eMode = ilPadSrc) void setKernel(const ilKernel* kern = NULL) void setKernelSize(int x, int y, int z = 1) void setKernFlags(int of = 0, int vf = 0) _p_r_o_t_e_c_t_e_d QQQQuuuueeeerrrryyyyiiiinnnngggg ssssppppaaaattttiiiiaaaallll ooooppppeeeerrrraaaattttoooorrrr ppppaaaarrrraaaammmmeeeetttteeeerrrrssss ilEdgeMode getEdgeMode() const ilKernel* getKernel() void getKernelSize(int& x, int& y, int& z) void getKernelSize(int& x, int& y) IIIImmmmaaaaggggeeee pppprrrroooocccceeeessssssssiiiinnnngggg ooooppppeeeerrrraaaattttiiiioooonnnn virtual ilStatus calcPage(void* inBuf, void* outBuf, ilXYZCint start, ilXYZCint end) = 0 _p_r_o_t_e_c_t_e_d OOOOppppeeeerrrraaaattttoooorrrr rrrreeeesssseeeetttt void resetOp() _p_r_o_t_e_c_t_e_d FFFFUUUUNNNNCCCCTTTTIIIIOOOONNNN DDDDEEEESSSSCCCCRRRRIIIIPPPPTTTTIIIIOOOONNNNSSSS iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg(((()))) ilSpatialImg() _p_r_o_t_e_c_t_e_d ilSpatialImg(ilImage* input, ilEdgeMode eMode = ilPadSrc) _p_r_o_t_e_c_t_e_d PPPPaaaaggggeeee 2222 iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) IIIImmmmaaaaggggeeeeVVVViiiissssiiiioooonnnn LLLLiiiibbbbrrrraaaarrrryyyy CCCC++++++++ RRRReeeeffffeeeerrrreeeennnncccceeee MMMMaaaannnnuuuuaaaallll iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) Two constructors are provided for convenience. The first constructor takes no arguments and is called by default during creation of a derived class. The new object will have a NULL input image and an edge mode of _i_l_P_a_d_S_r_c. The second constructor initializes the input image to _i_n_p_u_t and the edge mode to the enumerated type _i_l_E_d_g_e_M_o_d_e specified by _e_M_o_d_e; see also sssseeeettttEEEEddddggggeeeeMMMMooooddddeeee(). The kernel is initially NULL; it may be set with sssseeeettttKKKKeeeerrrrnnnneeeellll(). The bias value is initially zero; it may be set with sssseeeettttBBBBiiiiaaaassss() (inherited from ilOpImg). ccccaaaallllccccPPPPaaaaggggeeee(((()))) virtual ilStatus calcPage(void* inBuf, void* outBuf, ilXYZCint start, ilXYZCint end) = 0 _p_r_o_t_e_c_t_e_d This pure virtual function is defined by a derived class to process the data in the buffer pointed to by _i_n_B_u_f, and write the results to the buffer pointed to by _o_u_t_B_u_f. A derived class defines this function to implement its particular spatial processing algorithm. This function is called by eeeexxxxeeeeccccuuuutttteeeeRRRReeeeqqqquuuueeeesssstttt() to process a page of data. The input buffer is of the type specified by working data type, _w_T_y_p_e. The output buffer is of the type specified by image data type, _d_t_y_p_e. The derived class must convert from _w_T_y_p_e to _d_t_y_p_e as needed. The parameters _s_t_a_r_t and _e_n_d are of type _i_l_X_Y_Z_C_i_n_t. They describe where the data to be computed starts and ends in _i_n_B_u_f. For example, a derived class should use _s_t_a_r_t._x and _e_n_d._x to limit computation in the x dimension. ilSpatialImg provides other protected member variables that may be useful to a derived class. _i_n_S_t_r and _o_u_t_S_t_r, for example, provide all the strides for _i_n_B_u_f and _o_u_t_B_u_f, _k_e_r_n_S_z gives the number of nonzero kernel elements, and _k_e_r_n_O_f_f and _k_e_r_n_V_a_l provide the kernel offset and value table. See _i_l_S_p_a_t_i_a_l_I_m_g._h for the complete list. The following code fragment is an example of the computations in ccccaaaallllccccPPPPaaaaggggeeee(). This code implements a convolution and assumes both _w_T_y_p_e and _d_t_y_p_e are _i_l_F_l_o_a_ts. Also, the kernel weights are assumed to sum to 1.0, so that no clamping is necessary. PPPPaaaaggggeeee 3333 iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) IIIImmmmaaaaggggeeeeVVVViiiissssiiiioooonnnn LLLLiiiibbbbrrrraaaarrrryyyy CCCC++++++++ RRRReeeeffffeeeerrrreeeennnncccceeee MMMMaaaannnnuuuuaaaallll iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) float *in = (float *)inBuf; float *out = (float *)outBuf; for (int ci = start.c; ci < end.c; ci++) { /* iterate through all channels */ int cSrcIndex = ci*inStr.c; int cDstIndex = ci*outStr.c; for (int zi = start.z; zi < end.z; zi++) { /* iterate through z dimension */ int zSrcIndex = zi*inStr.z + cSrcIndex; int zDstIndex = zi*outStr.z + cDstIndex; for (int yi = start.y; yi < end.y; yi++) { /* iterate through y dimension */ int srcIndex = start.x*inStr.x + yi*inStr.y + zSrcIndex; int dstIndex = start.x*outStr.x + yi*outStr.y + zDstIndex; for (int xi = start.x; xi < end.x; xi++, srcIndex += inStr.x, dstIndex += outStr.x) { /* * iterate through x dimension * the variable bias, is inherited from ilOpImg */ float sum = bias; /* * kernVal should be cast to a float for any * wType, except ilDouble, in which case it * should be cast to a double. */ float *kr = (float *)kernVal; for (int k = 0 ; k < kernSz ; k++) /* iterate through nonzero kernel values */ sum += in[srcIndex+kernOff[k]] * kr[k]; /* note kernOff use to access correct input */ out[dstIndex] = sum; } } } } ggggeeeettttEEEEddddggggeeeeMMMMooooddddeeee(((()))) ilEdgeMode getEdgeMode() Returns the current edge mode as the enumerated type ilEdgeMode. See also sssseeeettttEEEEddddggggeeeeMMMMooooddddeeee(). PPPPaaaaggggeeee 4444 iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) IIIImmmmaaaaggggeeeeVVVViiiissssiiiioooonnnn LLLLiiiibbbbrrrraaaarrrryyyy CCCC++++++++ RRRReeeeffffeeeerrrreeeennnncccceeee MMMMaaaannnnuuuuaaaallll iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) ggggeeeettttKKKKeeeerrrrnnnneeeellll(((()))) const ilKernel *getKernel() This function returns the current input kernel value. ggggeeeettttKKKKeeeerrrrnnnneeeellllSSSSiiiizzzzeeee(((()))) void getKernelSize(int& x, int& y) void getKernelSize(int& x, int& y, int& z) This function is overloaded to conveniently handle the 2D case. It returns the current kernel size in _x, _y, and optionally, _z. See also sssseeeettttKKKKeeeerrrrnnnneeeellllSSSSiiiizzzzeeee(). rrrreeeesssseeeettttOOOOpppp(((()))) void resetOp() _p_r_o_t_e_c_t_e_d This function is automatically called during a reset operation. It updates various image parameters such as working data type, order and size. It also initializes various parameters based on the kernel size and edge mode and rebuilds kernel tables as needed. If a derived class redefines rrrreeeesssseeeettttOOOOpppp(), it must explicitly call iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg::::::::rrrreeeesssseeeettttOOOOpppp(). sssseeeettttDDDDyyyynnnnaaaammmmiiiiccccKKKKeeeerrrrnnnneeeellll(((()))) void setDynamicKernel(ilKernel* kern) This functions sets this objects input kernel to the ilKernel pointed to by _k_e_r_n. This function differs from iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg::::::::sssseeeettttKKKKeeeerrrrnnnneeeellll iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmggggSSSSeeeettttKKKKeeeerrrrnnnneeeellll in that this ilSpatialImg object will watch for changes to the input kernel. sssseeeettttEEEEddddggggeeeeMMMMooooddddeeee(((()))) void setEdgeMode(ilEdgeMode eMode = ilPadSrc) This function sets the edge mode to the enumerated type _i_l_E_d_g_e_M_o_d_e specified by _e_M_o_d_e. The edge mode specifies how to handle pixels along the edge of the image. Spatial operators process a neighborhood of input pixels defined by the kernel. Therefore, output pixels within half the kernel size along the edge of the image, do not have enough input data to be computed. This situation can be handled in many ways as specified by the edge mode. Several edge modes are supported such as: _i_l_P_a_d_S_r_c, _i_l_P_a_d_D_s_t, _i_l_N_o_P_a_d, PPPPaaaaggggeeee 5555 iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) IIIImmmmaaaaggggeeeeVVVViiiissssiiiioooonnnn LLLLiiiibbbbrrrraaaarrrryyyy CCCC++++++++ RRRReeeeffffeeeerrrreeeennnncccceeee MMMMaaaannnnuuuuaaaallll iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) _i_l_W_r_a_p and _i_l_R_e_f_l_e_c_t. The default edge mode is _i_l_P_a_d_S_r_c. For _i_l_P_a_d_S_r_c (pad source), extra input data is read, which allows pixels near the edge to be processed. The amount of extra data read depends on the kernel size in each dimension. The requested input data is filled as needed near the edge of the image, with the current _f_i_l_l_V_a_l_u_e. For _i_l_P_a_d_D_s_t (pad destination), the border along the edge of the image is filled with its _f_i_l_l_V_a_l_u_e. This is done because the resultant image is smaller than the input image by the kernel size in each dimension. For _i_l_N_o_P_a_d (no pad), nothing is done about the borders and the resulting image is reduced in size by the size of the kernel in each dimension causing a shift toward the origin. For _i_l_W_r_a_p, data from the opposite edge in the source image is used to fill in missing data along the edges. The amount of data wrapped depends on the size of the kernel in each dimension. For _i_l_R_e_f_l_e_c_t, data near an edge is reflected and used to fill in missing data along the edges. The amount of data reflected depends on the size of the kernel in each dimension. sssseeeettttKKKKeeeerrrrnnnneeeellll(((()))) void setKernel(const ilKernel* kern = NULL) This function sets the input kernel to the ilKernel pointed to by _k_e_r_n. The default value is NULL. This function calls sssseeeettttKKKKeeeerrrrnnnneeeellllSSSSiiiizzzzeeee() to update the size of the kernel. sssseeeettttKKKKeeeerrrrnnnneeeellllSSSSiiiizzzzeeee(((()))) void setKernelSize(int x, int y, int z = 1) The x, y and z size of the kernel are set to _x, _y and _z. This function also sets the minimum page size based on the size of the kernel. It is set to a multiple of the kernel size to enhance efficiency. sssseeeettttKKKKeeeerrrrnnnnFFFFllllaaaaggggssss(((()))) void setKernFlags(int of = 0, int vf = 0) _p_r_o_t_e_c_t_e_d This function sets the kernel offset flag to _o_f and the kernel value flag to _v_f. The default values are 0. The offset flag indicates that the offset table used to read input data needs to be updated. The PPPPaaaaggggeeee 6666 iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) IIIImmmmaaaaggggeeeeVVVViiiissssiiiioooonnnn LLLLiiiibbbbrrrraaaarrrryyyy CCCC++++++++ RRRReeeeffffeeeerrrreeeennnncccceeee MMMMaaaannnnuuuuaaaallll iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) value flag indicates that the value table that holds kernal values needs to be updated. IIIINNNNHHHHEEEERRRRIIIITTTTEEEEDDDD MMMMEEEEMMMMBBBBEEEERRRR FFFFUUUUNNNNCCCCTTTTIIIIOOOONNNNSSSS IIIInnnnhhhheeeerrrriiiitttteeeedddd ffffrrrroooommmm iiiillllOOOOppppIIIImmmmgggg checkMinMax(), clearClamp(), getBias(), getClamp(), getInputMax(), getInputMin(), getInputScaleMax(), getInputScaleMin(), getValidOrders(), getValidTypes(), isClamped(), isDiff(), isPrecisionKept(), keepPrecision(), resetOp(), setBias(), setClamp(), setMaxPageSize(), setMinPageSize(), setValidOrder(), setValidType(), setWorkingType() IIIInnnnhhhheeeerrrriiiitttteeeedddd ffffrrrroooommmm iiiillllMMMMeeeemmmmCCCCaaaacccchhhheeeeIIIImmmmgggg allocPage(), doUserPageAlloc(), enableMP(), executeRequest(), finishRequest(), freePage(), getGlobalThrashMode(), getMpRequest(), getPage(), getPageAllocTime(), getPageTime(), getRetainMode(), getRetainPath(), getThrashMode(), getThrashTime(), getTotalPageTime(), isMPenabled(), isUserPageAlloc(), prepareRequest(), setGlobalThrashMode(), setPage(), setPageAllocTime(), setRetainMode(), setRetainPath(), setThrashMode(), IIIInnnnhhhheeeerrrriiiitttteeeedddd ffffrrrroooommmm iiiillllCCCCaaaacccchhhheeeeIIIImmmmgggg enablePagingCallback(), flush(), getCacheSize(), isPagingCallbackEnabled(), listResident() IIIInnnnhhhheeeerrrriiiitttteeeedddd ffffrrrroooommmm iiiillllIIIImmmmaaaaggggeeee addInput(), allocFillData(), checkColorModel(), checkValidOrder(), checkValidType(), clipTile(), configureRetainedCache(), copy(), copyTile(), copyTile3D(), copyTileCfg(), fillTile(), fillTile3D(), fillTileRGB(), freeFillData(), getColorImg(), getColorModel(), getColormap(), getCompression(), getConfig(), getCopyConverter(), getCsize(), getDataType(), getDimensions(), getDirectInput(), getDisplayCacheEnable(), getFill(), getFillData(), getFillValue(), getHeight(), getHwEnable(), getHwHint(), getHwIntHint(), getHwOp(), getHwPassTable(), getInput(), getInputTileRequirement(), getLockTileSet(), getMaxColormapLevels(), getMaxValue(), getMinValue(), getNumChans(), getNumInputs(), getOrder(), getOrientation(), getPageBorder(), getPageBorderX(), getPageBorderY(), getPageBorderZ(), getPageCounts(), getPageDelta(), getPageDimensions(), getPageIndices(), getPageOrigin(), getPageOriginC(), getPageOriginX(), getPageOriginY(), getPageOriginZ(), getPageSize(), getPageSizeC(), getPageSizePix(), getPageSizeVal(), getPageSizeX(), getPageSizeY(), getPageSizeZ(), getPixel(), getPixel3D(), getPriority(), getScaleMax(), getScaleMin(), getSize(), getStrides(), getSubTile(), getSubTile3D(), getTile(), getTile3D(), getWidth(), getXsize(), getYsize(), getZsize(), hasPageBorder(), hasPages(), hwDefine(), hwGetPass(), inherit(), initColorModel(), initHwEnable(), initMinMax(), initPageSize(), initScaleMinMax(), isColorImg(), isIntegral(), isMirrorOrientation(), isPartialPage(), isSigned(), isValidPage(), isWritable(), lockPage(), lockPageSet(), lockTile(), lockTile3D(), mapFlipTrans(), mapFromInput(), mapFromSource(), mapOrientation(), mapSize(), mapTile(), mapToInput(), mapToSource(), mapXY(), mapXYSign(), outOfBound(), qCopyTileCfg(), qFillTile3D(), qFillTileRGB(), qGetSubTile3D(), qGetTile3D(), PPPPaaaaggggeeee 7777 iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) IIIImmmmaaaaggggeeeeVVVViiiissssiiiioooonnnn LLLLiiiibbbbrrrraaaarrrryyyy CCCC++++++++ RRRReeeeffffeeeerrrreeeennnncccceeee MMMMaaaannnnuuuuaaaallll iiiillllSSSSppppaaaattttiiiiaaaallllIIIImmmmgggg((((3333)))) qLockPageSet(), qSetSubTile3D(), qSetTile3D(), removeHwHint(), removeInput(), reset(), setColorModel(), setColormap(), setCompression(), setCsize(), setDataType(), setDisplayCacheEnable(), setFill(), setFillValue(), setHwEnable(), setHwHint(), setHwIntHint(), setInput(), setMaxColormapLevels(), setMaxValue(), setMinValue(), setNumChans(), setNumInputs(), setOrder(), setOrientation(), setPageBorder(), setPageSize(), setPageSizeC(), setPageSizeZ(), setPixel(), setPixel3D(), setPriority(), setScaleMinMax(), setScaleType(), setSize(), setSubTile(), setSubTile3D(), setTile(), setTile3D(), setTileRequirementFunction(), setWritable(), setXsize(), setYsize(), setZsize(), unlockPage(), unlockPageSet() IIIInnnnhhhheeeerrrriiiitttteeeedddd ffffrrrroooommmm iiiillllLLLLiiiinnnnkkkk addResetCallback(), alterAction(), anyAltered(), clearAllowed(), clearSet(), clearStatus(), deleteRelated(), disableAltered(), dumpChain(), getClassPropSet(), getDescription(), getDirectParent(), getDisabledIndex(), getFloatProp(), getGenerationID(), getIntProp(), getMaxIndex(), getMinIndex(), getNumChildren(), getNumParents(), getParent(), getProp(), getProp(), getPropSet(), getPtrProp(), getRelatedChild(), getRelatedDelete(), getRelatedType(), getStatus(), hasResetCallbacks(), ilGetClassPropSet(), inProgress(), isAllowed(), isAltered(), isEnabled(), isRelated(), isSet(), markSet(), mpUnlock(), neverReset(), newRelatedType(), removeParent(), removeProp(), removeResetCallback(), reset(), resetAltered(), resetCheck(), setAllowed(), setAltered(), setDescription(), setDisabledIndex(), setEnabled(), setParent(), setProp(), setPropAltered(), setRelatedDelete(), setRelatedType(), setStatus(), stopWatching(), unalterable(), watch(), watchNotify() SSSSEEEEEEEE AAAALLLLSSSSOOOO ilImage, ilCache, ilOpImg NNNNOOOOTTTTEEEESSSS If _w_T_y_p_e is different from _d_t_y_p_e, then the derived class must convert the data type between the input buffer and the output buffer. Note that an even-sized kernel causes a half-pixel shift away from the origin because the center of the kernel is _b_e_t_w_e_e_n the center elements. PPPPaaaaggggeeee 8888